package com.cskaoyan.javase.string._5stringbuffer;

/**
 * @description: StringBuffer的构造器
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 为什么StringBuffer/StringBuilder是可变的?
 *      因为存放字符串的value数组没有final修饰,所以可变
 *
 *
 * 可变字符串的value数组的长度实际上是字符串缓冲区的大小或者容量,意味着其中能够存放字符串的最大长度
 * value数组的长度在StringBuffer里称之为capacity容量,对应方法capacity()
 *
 * count对应字符串缓冲区中真实存在的字符串的长度,对应方法length()
 *
 * 搞明白上述两个概念后,就只剩下最后一个问题了: 扩容问题,可变字符串如果容量不够了,怎么扩容?
 *      扩容机制每次扩容大小为：**原value数组大小 * 2 + 2**
 *      如果这次扩容都不够,直接将传入字符串的长度+原先已经存在字符串的长度,作为新的容量(这时候容量=count相当于装满了)
 *
 *
 * 字符串的表示仍然是使用String的,只不过在做某些操作(主要是字符串频繁拼接)时,需要用一下StringBuffer
 *
 */
public class Demo2 {
    public static void main(String[] args) {
        // public StringBuffer()  无参构造方法 value数组的初始长度是16
        StringBuffer sb = new StringBuffer();

        // public StringBuffer(int capacity)  指定容量的字符串缓冲区对象
        StringBuffer sb2 = new StringBuffer(100);

        // public StringBuffer(String str)  指定字符串内容的字符串缓冲区对象
        //value数组的初始长度是传入的字符串长度+16
        StringBuffer sb3 = new StringBuffer("hello world!");


        System.out.println(sb.capacity()); //16
        System.out.println(sb2.capacity()); //100
        System.out.println(sb3.capacity()); //28

        System.out.println(sb.length()); //0
        System.out.println(sb.length()); //0
        System.out.println(sb3.length()); //12

        sb.append("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
        System.out.println(sb.capacity()); //47
        System.out.println(sb.length()); //47

        sb.append("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
        System.out.println(sb.capacity());
        System.out.println(sb.length());
    }
}
